#include <iostream>  
#include <fstream>  
#include <sys/mman.h>  
#include <sys/stat.h>  
#include <fcntl.h>  
#include <unistd.h>  
#include <cstring>  
  
int main() {  
    const char* filePath = "mmap_file";  
    const char* newContent = "Hello, mmap!\n";  
    size_t newContentLength = strlen(newContent);  
  
    // 打开文件  
    int fd = open(filePath, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);  
    if (fd == -1) {  
        perror("open");  
        return 1;  
    }  
  
    // 获取文件大小（如果文件不存在，则大小为0）  
    struct stat sb;  
    if (fstat(fd, &sb) == -1) {  
        perror("fstat");  
        close(fd);  
        return 1;  
    }  
  
    // 调整文件大小（如果需要的话，比如新内容比原文件大）  
    if (sb.st_size < newContentLength) {  
        if (ftruncate(fd, newContentLength) == -1) {  
            perror("ftruncate");  
            close(fd);  
            return 1;  
        }  
    }  
  
    // 将文件映射到内存  
    char* mapped = static_cast<char*>(mmap(0, newContentLength, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0));  
    if (mapped == MAP_FAILED) {  
        perror("mmap");  
        close(fd);  
        return 1;  
    }  
  
    // 使用指针写入文件内容  
    memcpy(mapped, newContent, newContentLength);  
  
    // 解除映射  
    if (munmap(mapped, newContentLength) == -1) {  
        perror("munmap");  
    }  
  
    // 关闭文件  
    close(fd);  
  
    std::cout << "File content has been updated using mmap." << std::endl;  
  
    return 0;  
}